package com.mnb.beidou.service;

import com.mnb.beidou.config.ParamRuleConfig;
import com.mnb.beidou.model.DataEntity;
import com.mnb.beidou.model.ModbusDataEntity;
import com.mnb.beidou.utils.CRC16Utils;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 报文解析器，基于《PS+MODBUS协议用户版V0.1(1).pdf》的协议规范和采集数据格式
 */
@Component
public class Data2CParser {

    /**
     * 解析十六进制报文并赋值给实体类
     * @param hexMessage 十六进制报文（如文档1中的示例报文）
     * @return 解析后的实体对象
     */
    public DataEntity parse(String hexMessage) throws Exception {
        hexMessage = hexMessage.replace(" ", "");
        DataEntity entity = new DataEntity();
        int index = 0;

        // 跳过从机地址（2字节）、功能码（2字节）、数据长度（4字节），直接解析数据区
        // （文档1中报文结构：65 2C 003E [数据区] 5ABD，前8字节为头部）
//        index += 8;

        int currentAddr = 35001; // 起始地址（对应文档1参数表的地址）
        // 解析数据区，直到CRC校验位（末尾4字节）
        while (index < hexMessage.length() - 4) {
            ParamRuleConfig.ParamRule rule = ParamRuleConfig.PARAM_RULES.get(currentAddr);
            if (rule != null) {
                // 计算当前参数的十六进制长度（每个寄存器2字节）
                int hexLen = rule.getRegCount() * 2 * 2;
                if (index + hexLen > hexMessage.length() - 4) {
                    break; // 数据不足时停止解析
                }

                // 提取寄存器值（十六进制）
                String regHex = hexMessage.substring(index, index + hexLen);
                long value = Long.parseLong(regHex, 16);


                // 转换为实际值（除以10的小数位数次方，文档1中转换规则）
                double actualValue = value / Math.pow(10, rule.getDecimalPlaces());

                // 通过反射调用实体类的setter方法赋值
                String setterName = "set" + rule.getFieldName().substring(0, 1).toUpperCase() + rule.getFieldName().substring(1);
                Method setter = DataEntity.class.getMethod(setterName, double.class);
                if (rule.getFieldName().equals("totalFlow")) {
                    setter.invoke(entity, (long) actualValue);
                } else {
                    setter.invoke(entity, actualValue);
                }

                index += hexLen;
            } else {
                // 跳过未定义的寄存器（文档1说明：未定义寄存器保留占位但解析时跳过）
                index += 2;
            }
            if(rule != null){
                currentAddr = currentAddr + rule.getRegCount();
            }

        }
        entity.setMsgJson(entity.toJsonString());
        System.out.println(entity.toString());
        return entity;
    }



    public static void main(String[] args) {
        try {
            // 示例报文（来自文档1中的数据）
            String message = "0003F4DD000002C30000000000000000052A00000ACC0000070F00001E01000000000000000000000000057600006D000000000000000000000000000000";
            Data2CParser parser = new Data2CParser();
            DataEntity entity = parser.parse(message);

            System.out.println(entity.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}